package rs.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;

import rs.util.Requester;

/* Classe che rappresenta un thread creato per compiere un certo task su oggetti di tipo T. */
public class WorkerTask<T> implements Callable<Integer> {

	private OnerousProcessor<T> processor;
	private ConcurrentLinkedQueue<T> queue;
	private Requester app;
	
	public WorkerTask(OnerousProcessor<T> processor, ConcurrentLinkedQueue<T> queue) {
		this.queue = queue;
		this.processor = processor;
		this.app = new Requester();
	}

	@Override
	/* Metodo che permette di lanciare l'esecuzione di questa classe.
	 * Ogni volta si estrae un elemento dalla lista di input e lo si processa.
	 * Quando la lista è vuota il processo termina. */
	public Integer call() throws Exception {
		T node = this.queue.poll();
		while (node != null) {
			this.processor.onerousFunction(this.app, node);
			node = this.queue.poll();
		}
		return 1;
	}

}
